package com.ashlikun.okhttputils.retrofit

import com.ashlikun.okhttputils.retrofit.Params
import java.lang.annotation.Inherited

/**
 * 作者　　: 李坤
 * 创建时间: 2020/12/15　14:02
 * 邮箱　　：496546144@qq.com
 *
 * 功能介绍：Http仿造Retrofit的注解
 */

//请求的url，可以有占位符
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class Get(val url: String = "")

//请求的url，可以有占位符
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class Post(val url: String = "")

/**
 *  请求的url，可以有占位符
 * 1：在方法上  当前
 * 2：在接口上  全部
 */
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Url(val url: String, val method: String = "POST")

/**
 * 请求的方法
 * 1：在方法上  当前
 * 2：在接口上  全部
 */
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Mehtod(val method: String = "POST")

/**
 * 使用json请求,不加注解就使用全局的
 * 1：在方法上  当前
 * 2：在接口上  全部
 */
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Json(val value: Boolean = true)


/**
 * 请求的path 可以有占位符 ：/user/{id}
 * @param replace 是否替换父类的
 * 如果接口上也有配置，那么默认会相加，如果replace=true那么就替换
 * 1：在方法上  当前,
 * 2：在接口上  全部
 */
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Path(val value: String, val replace: Boolean = false)

/**
 * 1：在方法上，当前请求会加上一个参数，格式可以是（ key:valye）或者（value）
 *            当格式是value的时候他的key就是在当前类的@Param
 *            如果只设置了一个如（key:)那么另一个就是方法名,如果（:value）另一个就是接口上的@Param
 *            如果为value ="" 就清空
 * 2：在接口上，表示当前全部方法的第一个参数的key
 */
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Action(val value: String)

/**
 * 数据解析的区别
 * 1：在方法上  当前
 * 2：在接口上  全部
 */
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS)
@Inherited
@Retention(AnnotationRetention.RUNTIME)
annotation class Parse(val parse: String)

/**
 * 提交的字段
 * 1：基本数据类型，直接就是具体值
 * 2：File 类型，就会强制使用File
 * 3：Map和其他对象，就会使用json序列化成多个字段
 */
@Target(AnnotationTarget.VALUE_PARAMETER)
@Inherited
@Retention(AnnotationRetention.RUNTIME)
annotation class Field(
    val key: String = "",
    val encoded: Boolean = false,
    //是否是文件
    val isFile: Boolean = false,
    //是否作为一个data提交，当只有一个参数的时候生效,只支持String，其他对象会调用toString
    val isBody: Boolean = false,
    //这个参数 是否是放到请求header里面的
    val isHeader: Boolean = false,
    //如果是多个文件是否用同一个key变成数组
    val isFileArray: Boolean = false,
    //对象是否变成释放变成根节点
    val isObjToRoot: Boolean = true,
    //这个参数 是否是放到请求url里面的
    val isUrlQuery: Boolean = false,
    //这个参数 是否是放到请求path 里面如 /user/{id}   key就是id的占位数据
    val isPath: Boolean = false,
)

/**
 * 这个字段不用提交,用于回调的时候处理
 * 可以作用在类上
 */
@Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.CLASS)
@Inherited
@Retention(AnnotationRetention.RUNTIME)
annotation class FieldNo

/**
 * 用户请求的固定参数
 * *@Params({
 * "key1:value1"，
 * "key2:value2"
 * })
 *  *@Params("key:value")
 *  1:用在方法上，当前请求
 *  2:用在接口上，当前接口全部请求
 *
 *  @param value 简单写法 key:value   冒号隔开，可以多对
 *  @param key 固定写法 key  与  text一对
 *  @param text 固定写法 value  与 key一对
 *
 *  @param isUrl 是否是url参数
 *  @param isHeader 是否是header参数
 *  @param isMultipartFormDataNoContentLength 请求 multipart/form-data 文件类型的时候 是否去除其他参数的Content-Length 解决部分服务器不能识别Content-Length导致无法提交
 *  @param isUrlQuery 是否是url参数
 */
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
@Inherited
@Retention(AnnotationRetention.RUNTIME)
@Repeatable
annotation class Params(
    vararg val value: String,
    val key: String = "",
    val text: String = "",
    val isUrlQuery: Boolean = false,
    val isHeader: Boolean = false,
)

/**
 * 请求的其他配置信息
 * 请求 multipart/form-data 文件类型的时候 是否去除其他参数的Content-Length 解决部分服务器不能识别Content-Length导致无法提交
 */
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
@Inherited
@Retention(AnnotationRetention.RUNTIME)
annotation class ConfigMultipartFormDataNoContentLength(val value: Boolean = true)

/**
 * 请求的其他配置信息
 * 一条数据的时候是不是转化为json数组 前提是json请求
 */
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
@Inherited
@Retention(AnnotationRetention.RUNTIME)
annotation class ConfigOneParamsJsonArray(val value: Boolean = true)

/**
 * 用户请求的头
 * * @Headers({
 * "key1:value1"，
 * "key2:value2"
 * })
 * * @Headers("key:value")
 *  1:用在方法上，当前请求
 *  2:用在接口上，当前接口全部请求
 */
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
@Inherited
@Retention(AnnotationRetention.RUNTIME)
@Repeatable
@Deprecated("使用Params.isHeader代替", ReplaceWith("@Params(*value,isHeader = true)"))
annotation class Headers(vararg val value: String)

/**
 * 用户请求的头,用于参数
 * 如果是空，会取参数的名字
 */
@Target(AnnotationTarget.VALUE_PARAMETER)
@Inherited
@Retention(AnnotationRetention.RUNTIME)
@Repeatable
@Deprecated("使用Field.isHeader代替", ReplaceWith("@Field(value,isHeader = true)"))
annotation class Header(val value: String = "")